// 也可以直接使用字面量进行类型声明
let a: 10;
a =  10;

// 可以使用 | 来连接多个类型（联合类型）  
let b: 'male' | 'female';
b = 'male'
b = 'female'

let c: boolean | string;
c = true;
c = 'hello';

// any 表示的是任意类型，一个变量的类型为any相当于变量关闭了ts的类型检测

let d1: any; // 不建议使用（默认为any）

// 默认不写为any,变量 "d" 隐式具有 "any" 类型，但可以从用法中推断出更好的类型。
let d;  // 不建议使用（默认为any）

d = 9;
d = 'hello';
d = true;

// 如果对类型未知，则可以使用unknow
let e: unknown;
e = 3;
e = 'hello';

let s:string;

// d的类型是any，可以赋值给string类型
s = d;
// d的类型是unknow，不可以赋值给string类型
// s = e;  不能将类型“unknown”分配给类型“string”

// 可以先判断，再赋值
if (typeof e === "string"){
    s = e;
}

// 类型断言,可以告诉解析器e为string
// 方法一
s = e as string;
// 方法二
s = <string>e;


// 函数返回值
// 返回指定类型
function fn(num):number{
    return 123;
}

// 当返回多个类型时，则返回any
function fn1(num){
    if (typeof num === "string"){
        return 'num';
    }
    else{
        return 1;
    }
}

// 也可以指定不返回,但可以返回undefined,其他都不可以
function fn2():void{
    return undefined;
}


// 也可以指定不返回,什么都不可以返回，可以抛出错误
function fn3():never{
    throw new Error('出错了')
}